// utils/request.js

// 基础配置
const baseConfig = {
  baseURL: 'http://111.229.46.23:8182',
  timeout: 10000,
  header: {
    'Accept': 'application/json'
  }
};

// 工具函数：将对象转换为URL查询字符串
function objectToQueryString(obj) {
  if (!obj || typeof obj !== 'object') return '';
  
  return Object.keys(obj)
    .map(key => {
      const value = obj[key];
      if (value === undefined || value === null) return '';
      return encodeURIComponent(key) + '=' + encodeURIComponent(value);
    })
    .filter(part => part !== '')
    .join('&');
}

// 请求拦截器
function requestInterceptor(config) {
  console.log('请求配置:', config);
  
  // 确保baseURL和路径正确拼接
  if (config.url && !config.url.startsWith('http')) {
    config.url = baseConfig.baseURL + config.url;
  }
  
  // 添加token
  const token = uni.getStorageSync('token');
  if (token) {
    config.header.Authorization = `Bearer ${token}`;
  }
  
  // 处理GET请求的参数
  if (config.method && config.method.toUpperCase() === 'GET') {
    const queryString = objectToQueryString(config.data);
    if (queryString) {
      config.url += (config.url.includes('?') ? '&' : '?') + queryString;
      // GET请求参数已拼接到URL，清空data
      config.data = undefined;
    }
  } else if (config.isUploadFile) {
    // 上传文件：不设置Content-Type，让浏览器自动处理
    delete config.header['Content-Type'];
  } else if (config.contentType === 'form') {
    // 表单格式
    config.header['Content-Type'] = 'application/x-www-form-urlencoded';
    // 对数据进行URL编码
    if (config.data) {
      config.data = objectToQueryString(config.data);
    }
  } else {
    // 默认JSON格式
    config.header['Content-Type'] = 'application/json';
    // 确保JSON数据被字符串化
    if (config.data && typeof config.data !== 'string') {
      config.data = JSON.stringify(config.data);
    }
  }
  
  return config;
}

// 响应拦截器
function responseInterceptor(response) {
  console.log('响应数据:', response);
  uni.hideLoading();
  
  const { data } = response;
  
  if (data.code == '00000') {
    return data.data;
  } else if (data.code == 'A0300') {
    uni.$u.toast('请先登录');
    setTimeout(() => uni.navigateTo({ url: '/pages/login/login' }), 1000);
    return Promise.reject(new Error('未登录'));
  } else {
    uni.$u.toast(data.message || '请求失败');
	uni.navigateTo({
		url: `/pages/login/login`
	});
    return Promise.reject(new Error(data.message || '请求失败'));
  }
}

// 错误处理
function errorHandler(error) {
  console.error('请求错误:', error);
  uni.hideLoading();
  
  if (error.errMsg) {
    if (error.errMsg.includes('timeout')) {
      uni.$u.toast('请求超时');
    } else if (error.errMsg.includes('request:fail')) {
      uni.$u.toast('网络连接失败');
    } else {
      uni.$u.toast(error.errMsg || '请求出错');
    }
  }
  
  return Promise.reject(error);
}

// 封装请求方法
function request(options) {
  const config = { ...baseConfig, ...options };
  const interceptedConfig = requestInterceptor(config);
  
  // 打印请求信息
  console.log('发送请求:', {
    url: interceptedConfig.url,
    method: interceptedConfig.method,
    data: interceptedConfig.data,
    headers: interceptedConfig.header
  });
  
  return new Promise((resolve, reject) => {
    uni.request({
      ...interceptedConfig,
      success: (response) => {
        try {
          resolve(responseInterceptor(response));
        } catch (error) {
          reject(error);
        }
      },
      fail: (error) => {
        reject(errorHandler(error));
      }
    });
  });
}

// 封装常用请求方法
export default {
  get(url, data = {}, config = {}) {
    return request({
      url,
      data,
      method: 'GET',
      ...config
    });
  },
  
  post(url, data = {}, config = {}) {
    return request({
      url,
      data,
      method: 'POST',
      ...config
    });
  },
  
  put(url, data = {}, config = {}) {
    return request({
      url,
      data,
      method: 'PUT',
      ...config
    });
  },
  
  delete(url, data = {}, config = {}) {
    return request({
      url,
      data,
      method: 'DELETE',
      ...config
    });
  },
  
  // 上传文件
  upload(url, filePaths, formData = {}, config = {}) {
    return request({
      url,
      method: 'POST',
      isUploadFile: true,
      files: filePaths,
      fileType: 'image',
      formData: formData,
      ...config
    });
  }
};